PHP cookies
Een computercookie, algemeen bekend als een HTTP-cookie of webcookie, is een klein tekstbestand waarin kleine stukjes informatie opslagen wordt. Ze worden gemaakt door de websites die je bezoekt en worden op je computer opgeslagen.
Het gaat meestal o een soort trackinginformatie die de website helpt bij het uitvoeren van verschillende taken, zoals het beheren van een sessie-ID wanneer je je aanmeldt. Cookies zijn maximum 4 kB groot, ze kunnen dus geen grote hoeveelheden gegevens bevatten.
In dit lesonderdeel leer je cookies in je programma's instelt, leest en verwijdert.
Geschiedenis van de cookies
- 1994 –Netscape draft
- 1997 –RFC 2109•2000 –RFC 2965
- 2002 –HttpOnly
- 2011 –RFC 6265
- 2017 –RFC 6265bis (draft)
Soorten cookies
Er zijn drie verschillende soorten cookies, met elk een specifiek doel:
-
Sessiecookies zijn tijdelijke cookies. Ze worden gemaakt tijdens één enkele sessie en verdwijnen weer zodra je de browser sluit. Het zijn first-party cookies en het beheer ervan ligt volledig in handen ligt in de handen van de website. De gebruiker kan sessiecookies niet uitschakelen vanuit zijn browser.
Sessiecookies worden doorgaans gebruikt door overheidswebsites en online banken. Ze houden uw browsesessie bij terwijl u actief op de site navigeert. Zodra u de browser sluit, vervallen de cookies automatisch.
Dit voorkomt dat kwaadwillende gebruikers met jouw opgeslagen sessiegegevens de website op een later tijdstip kunnen bezoeken.
-
Permanente cookies verlopen niet nadat je de browser hebt gesloten of zelfs de computer heb uitgezet. Daarom worden ze worden permanente cookies of tracking cookies genoemd.
Ze hebben een vervaldatum die is ingesteld door de website en blijven tot dan geldig.
Permanente cookies helpen gebruikers om hun eerdere aanmeldingen bij te houden, zodat ze niet elke keer dat ze een website bezoeken gebruikersnaam en wachtwoorden moeten invoeren.Hoewel de mogelijkheid 'houd mij aangemeld' of 'onthoud mij' op websites handig is, is het niet bepaald veilig. Het laat mensen met kwaadaardige bedoelingen toe om op de een of andere manier toegang te krijgen tot je computer.
Je kan ervoor kiezen om cookies uit te schakelen maar dat beperkt de mogelijkheid om door de website te navigeren, aangezien, zoals hierboven vermeld, cookies worden gebruikt om de sessies van gebruikers bij te houden, zodat ke bijvoorbeeld geen toegang krijgt tot het klantgedeelte of je telkens weer moet aanmelden.
Een tussenoplossing bestaat erin dat je cookies toestaat en dat je om voorkomen dat je gegevens worden misbruikt, nu en dan het cachegeheugen van je browser wist.
-
Cookies van derden (third-party) zijn bekend als marketing- of trackingcookies. Third-party cookies worden niet door de websitebeheerder gegenereerd, maar door een derde partij door middel van van advertenties, of iets dergelijks. Cookies van derden verzamelen voornamelijk marketingrelevante informatie, zoals gegevens over leeftijd, afkomst, geslacht en gebruikersgedrag, en door deze verzameling zijn ze krachtige online marketingtools, vooral voor gepersonaliseerde advertenties.
Daar komt het dat je bij het bezoeken van een website soms een banner of advertentie van een product ziet, dat je eerder ergens anders hebt bekeken.
Hoewel adverteerders beweren dat hun doel duidelijk is om gebruikers een persoonlijkere ervaring te bieden, vinden de meeste mensen deze tracking cookies een inbreuk op hun privacy en beschouwen ze het als illegaal. Google, Facebook, YouTube en Twitter zijn enkele van de meest voorkomende websites die cookies van derden gebruiken.
Cookies in PHP
De PHP-engine gebruikt een cookie om een link tussen een bepaalde webclient en de webserver te creëren en te onthouden. Daarmee worden je webpagina's stateful.
Eén keer die cookie door de PHP-engine is gecreëerd en verstuurd, wordt deze cookie samen met het verzoek meegestuurd elke keer dat een webclient een verzoek indient.
De engine leest de cookie en komt erachter dat een bepaald verzoek afkomstig is van dezelfde webclient die eerdere verzoeken heeft gedaan, die door dezelfde cookie werden vergezeld.
Een cookie heeft een naam, bijvoorbeeld "klant" en een waarde, bijvoorbeeld "54678" of "Hana").
Eén cookie dient één stukje informatie bij te houden. Als je meer dan 1 item over een gebruiker wenst bij te houden, bijvoorbeeld de inhoud van het winkelwagentje van die gebruiker, is het niet aan te raden hiervoor meerdere cookies te gebruiken. Dan gebruik je beter 1 cookie samen met de sessiemogelijkheden van PHP.
Een sessie gebruikt één cookie om gebruikers van elkaar te onderscheiden en maakt het mogelijk om voor elke gebruiker meerdere gegevens op de server te bewaren. Deze gegevens blijven over alle verzoeken heen bestaan. Meer over sessies vind je op PHP sessies.
Werken met cookies in PHP
Gebruik de functie setcookie
om een cookie in te stellen. Dit zorgt ervoor dat de webclient een cookienaam en -waarde onthoudt en deze bij volgende verzoeken terug te sturen naar de server.
Het volgende statement stelt een cookie met de naam user
in op de waarde Kees
:
setcookie ('user', 'Kees');
Gebruik de $ _COOKIE autoglobal om een eerder ingestelde cookie uit te lezen:
array. Om de waarde van de user
-cookie weer te geven:
echo 'Hallo'. $ _COOKIE ['user'];
De waarde voor een cookie die je aan setcookie meegeeft, kan een tekenreeks of een getal zijn. Het mag geen array of meer gecompliceerde gegevensstructuur zijn.
De functie setcookie
URL-codeert de cookiewaarde voordat deze naar de webclient wordt verzonden. Dit betekent dat een spatie wordt omgezet in een +, en alle tekens, die geen letters, cijfers, onderstrepingstekens, koppeltekens en punten zijn, omgezet worden in een procentteken gevolgd door de ASCII-waarde in hexadecimaal.
Als je niet wilt dat PHP uw cookiewaarde URL-codeert, gebruik dan setrawcookie
in plaats van setcookie
. Met setrawcookie
mag de cookiewaarde geen =, ,,; of witruimte bevatten.
https://stackoverflow.com/questions/39860045/how-do-i-use-cookies-to-store-shopping-cart-content
Oefening
Gebruik de code in dit voorbeeld niet in een productiewebsite. Deze code is niet veilig en dient alleen om te leren werken met cookies!
We maken een pseudo-webshop, een login pagina en een pagina waarop je boeken kan bestellen. We houden de aangemelde gebruiker bij. Elk besteld boek wordt in een 'winkelwagentje' gestopt.
Overzicht
Als je de functie setcookie
aanroept, bevat het antwoord dat de PHP-engine genereert om terug te sturen naar de webclient, een speciale header die de webclient vertelt over de nieuwe cookie. Bij volgende verzoeken verzendt de webclient die cookienaam en waarde terug naar de server:
Stappenplan
- Maak een map met de naam cookies-sessions in de webroot.
- Maak een index.php pagina:
- plaats daarin een login
form
. Als de gebruiker op de Aanmelden knop klikt wordt dezelfde pagina op de server aangevraagd:<form class="logging-in" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="POST"> <div class="field"> <label for="user-name">Gebruikersnaam: </label> <input id="user-name" name="user-name" class="text" type="text" required/> </div> <button type="submit" name="submit" id="login" value="login">Aanmelden</button> </form>
- bovenaan de pagina:
<?php // kijk als in de request een userName cookie werd meegestuurd: 1$userName = isset($_COOKIE['userName']) ? $_COOKIE['userName'] : null; // als op de submit knop werd gedklikt moet je de persoon aanmelden 2if ($_SERVER['REQUEST_METHOD'] === 'POST') { 3 if ($_POST['submit'] == 'login') { // setcookie: er wordt een cookie meegestuurd naar de client // de request die net binnenkwam van de client naar de server // bevat geen cookie, die zal slechts de volgende keer // dat de request wordt ingediend meegestuurd worden. $userName = $_POST['user-name']; setcookie('userName', $userName); } 4elseif ($_POST['submit'] == 'logout') { // There is no specific function for deleting a cookie in PHP. // However, we recommend you to use the PHP setcookie() function // mentioning the expiration date in the past as demonstrated below: setcookie("userName", "", time() - 3600); $userName = null; } } ?>
- checken we als de cookie met de naam
userName
al bestaat, als die bestaat is de gebruiker al aangemeld en slaan we de naam op in de$userName
variabele anders stellen we de variabele in opnull
- checken we als de pagina werd aangevraagd door op de Aanmelden of Afmelden knop te drukken, dan doen we door naar de waarde van
$_SERVER['REQUEST_METHOD']
te kijken - indien op de Aanmelden knop werd gedrukt slaan we de ingetype naam op in de variabele
$userName
en maken we een cookie met de sleuteluserName
en de waarde van de variabele$userName
- indien op de Afmelden knop werd gedrukt vernietigen we de cookie en stellen de
$userName
variabele in opnull
- checken we als de cookie met de naam
- Na de
form
zeg je welkom:<h1>Welkom</h1>
- Vervolgens:
<?php 1if (isset($userName)) { ?> 2<p><?php echo $userName; ?></p> 3<form class="logging-out" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="POST"> 4<button type="submit" name="submit" id="logout" value="logout">Afmelden</button> </form> 5 <a href="catalog.php">Ga naar boekencataloog</a> <?php } ?>
- Als de gebruiker is aangemeld ($
userName
is niet gelijk aannull
) tonen we het volgende: - de naam
- een
form
die dezelfde pagina op de server oproept als op de submit knop wordt geklikt - een aanmeldingsknop
- een link naar de boekencatalogus
- Als de gebruiker is aangemeld ($
- plaats daarin een login
- Maak de catalog.php pagina:
<?php // deze code dient om te leren werken met cookies en moet je niet in // een productiewebsite gebruiken! // kijk als in de request een shopping-cart cookie werd meegestuurd: 1$shoppingCart = isset($_COOKIE['shoppingCart']) ? $_COOKIE['shoppingCart'] : null; 2if ($_SERVER["REQUEST_METHOD"] == "POST") { 2.1if (isset($_POST['shopping-cart']) && $_POST['shopping-cart'] === 'empty') { // There is no specific function for deleting a cookie in PHP. // However, we recommend you to use the PHP setcookie() function // mentioning the expiration date in the past as demonstrated below: setcookie("shoppingCart", "", time() - 3600); $shoppingCart = null; } 2.2elseif (isset($_POST['order'])) { // zat er al iets in de shopping-cart cookie? 2.2.1if (isset($shoppingCart)) { $shoppingCart .= ', ' . $_POST['order']; } 2.2.2else { $shoppingCart = $_POST['order']; } 2.3setcookie('shoppingCart', $shoppingCart); } } ?>
- als de catalog.php pagina op de webserver opgevraagd wordt kijken we eerst of er een cookie werd meegestuurd met de inhoud van de winkelwagen; als er een shoppingCart cookie werd meegestuurd slaan de waarde op in de variabele $shoppingCart anders is de variabele gelijk aan null;
- als de catalog.php pagina op de webserver opgevraagd wordt door op een submit knop te klikken (POST) zijn er twee mogelijkheden:
- als er op de Afmelden knop geklikt werd zit er
shopping-cart
sleutel met waardeempty
in de globale$_POST
array en dan verwijderen we deshoppingCart
cookie; - als er op een bestel knop werd geklikt zit er een
order
sleutel met als waarde de titel en de auteur van het boek in de globale$_POST
array dan zijn er weer twee mogelijkheden:- er zitten al boeken in de
$shoppingCart
variable, in dat geval plakken we het nieuw bestelde boek aan de reeds bestelde boeken, die in de variabele$shoopingCart
staan, voorafgegaan door een komma; - is de
$shoppingCart
variabele isnull
, stoppen we de gegevens van het bestelde boek in de$shoppingCart
variabele
- er zitten al boeken in de
- we plaatsen de waarde van de geüpdate
$shoppingCart
variabele in deshoppingCart
cookie
- als er op de Afmelden knop geklikt werd zit er
- Dan volgt de HTML
<!doctype html> 1<html lang="nl"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> 2<title>Boekencataloog - werken met cookies</title> </head> <body> 3<h1>Boekencataloog</h1> 4<h2>Welkom <?php echo isset($_COOKIE['userName']) ? $_COOKIE['userName'] : 'Je bent niet aangemeld.'; ?></h2> 5<p>Je bestellingen:</p> 6<p><?php echo isset($shoppingCart) ? $shoppingCart : 'Nog geen boeken besteld.'; ?></p> 7<button type="submit" name="shopping-cart" id="empty" value="empty" form="catalog-form">Winkelkar leegmaken </button> 8<h3>Bestel een boek</h3> 9<form method="post" id="catalog-form" name="catalog-form" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>"> <div> 10.1<label for="book-1">Herman Portocarero, De zwarte handel</label> 10.2<button id="book-1" name="order" value="Herman Portocarero, De zwarte handel">Bestel</button> </div> <div> 10.1<label for="book-2">Aristophanes, Ploutos de god van het geld</label> 10.2<button id="boek-2" name="order" value="Aristophanes, Ploutos de god van het geld">Bestel</button> </div> <div> 10.1<label for="book-3">Steve Prettyman, Learn PHP 8</label> 10.2<button id="prettyman" name="order" value="Steve Prettyman, Learn PHP 8">Bestel</button> </div> <div> 10.1<label for="daudet">Alphonse Daudet, Brieven uit mijn molen</label> 10.2<button id="daudet" name="order" value="Alphonse Daudet, Brieven uit mijn molen">Bestel</button> </div> </form> 11<a href="index.php">Terug naar de index pagina</a> </body> </html>
- we beginnen met de taal in te stellen die in de webpagina gebruikt wordt, namelijk het Nederlands;
- we geven een waarde aan het
title
element in hethead
element - we voegen een koptekst toe met daarin de tekst Boekencataloog
- we voegen een tussentitel toe met daarin, als er een
userName
cookie is meegestuurd, de naam van de gebruiker en anders een boodschap dat er nog niemand is aangemeld; - we voegen een paragraaf toe met de tekst Je bestellingen;
- we kijken als er iets in de variabele
$shoppingCart
staat, indien zo tonen we de lijst van de bestelde boeken anders een boodschap dat er nog geen boeken besteld zijn; - we voegen een
button
element toe om de winkelkar te legen; het is eensubmit
knop, hetname
attribuut stellen we in opshopping-cart
, hetvalue
attribuut opempty
en hetform
attribuut op de id van deform
die we straks nog geen toevoegen; - we voegen een subtitel toe met de tekst Bestel een boek;
- we voegen een
form
toe die wanneer op eensubmit
knop wordt geklikt, dezelfde pagina, namelijk catalog.php op de webserver zal opvragen met eenPOST
; 2.1van de codeblok in het vorige punt zal worden uitgevoerd; - voor elk te bestellen boek voegen:
- een
label
element toe waarvan hetfor
attribuut ingesteld is op deid
van het overeenkomstigebuttom
element - een
buttom
element toe waarvan hetid
attribuut ingesteld is opauteur-n
, een auteur volgnummer, hetname
attribuut oporder
en hetvalue
attribuut op de naam van de auteur en de titel van het boek; 2.2van de codeblok in het vorige punt zal worden uitgevoerd;
- een
- tenslotte voegen een we link toe om terug te keren naar de index.php pagina;
- Een overzicht van de opeenvolgende HTTP requests:
- eerste verzoek
- tweede verzoek
- derde verzoek
- vierde verzoek
- vijfde verzoek
- De volledige code
- index.php
<?php // kijk als in de request een userName cookie werd meegestuurd: $userName = isset($_COOKIE['userName']) ? $_COOKIE['userName'] : null; // als op de submit knop werd gedklikt moet je de persoon aanmelden if ($_SERVER['REQUEST_METHOD'] === 'POST') { if ($_POST['submit'] == 'login') { // setcookie: er wordt een cookie meegestuurd naar de client // de request die net binnenkwam van de client naar de server // bevat geen cookie, die zal slechts de volgende keer // dat de request wordt ingediend meegestuurd worden. $userName = $_POST['user-name']; setcookie('userName', $userName); } elseif ($_POST['submit'] == 'logout') { // There is no specific function for deleting a cookie in PHP. // However, we recommend you to use the PHP setcookie() function // mentioning the expiration date in the past as demonstrated below: setcookie("userName", "", time() - 3600); $userName = null; } } ?> <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Werken met cookies - logging in</title> </head> <body> <form class="logging-in" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="POST"> <div class="field"> <label for="user-name">Gebruikersnaam: </label> <input id="user-name" name="user-name" class="text" type="text" required/> </div> <button type="submit" name="submit" id="login" value="login">Aanmelden</button> </form> <h1>Welkom</h1> <?php if (isset($userName)) { ?> <p><?php echo $userName; ?></p> <form class="logging-out" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="POST"> <button type="submit" name="submit" id="logout" value="logout">Afmelden</button> </form> <a href="catalog.php">Ga naar boekencataloog</a> <?php } ?> </body> </html>
- catalog.php
<?php // deze code dient om te leren werken met cookies en moet je niet in // een productiewebsite gebruiken! // kijk als in de request een shopping-cart cookie werd meegestuurd: $shoppingCart = isset($_COOKIE['shoppingCart']) ? $_COOKIE['shoppingCart'] : null; if ($_SERVER["REQUEST_METHOD"] == "POST") { if (isset($_POST['shopping-cart']) && $_POST['shopping-cart'] === 'empty') { // There is no specific function for deleting a cookie in PHP. // However, we recommend you to use the PHP setcookie() function // mentioning the expiration date in the past as demonstrated below: setcookie("shoppingCart", "", time() - 3600); $shoppingCart = null; } elseif (isset($_POST['order'])) { // zat er al iets in de shopping-cart cookie? if (isset($shoppingCart)) { $shoppingCart .= ', ' . $_POST['order']; } else { $shoppingCart = $_POST['order']; } setcookie('shoppingCart', $shoppingCart); } } ?> <!doctype html> <html lang="nl"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Boekencataloog - werken met cookies</title> </head> <body> <h1>Boekencataloog</h1> <h2>Welkom <?php echo isset($_COOKIE['userName']) ? $_COOKIE['userName'] : 'Je bent niet aangemeld.'; ?></h2> <p>Je bestellingen:</p> <p><?php echo isset($shoppingCart) ? $shoppingCart : 'Nog geen boeken besteld.'; ?></p> <button type="submit" name="shopping-cart" id="empty" value="empty" form="catalog-form">Winkelkar leegmaken </button> <h3>Bestel een boek</h3> <form method="post" id="catalog-form" name="catalog-form" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>"> <div> <label for="book-1">Herman Portocarero, De zwarte handel</label> <button id="book-1" name="order" value="Herman Portocarero, De zwarte handel">Bestel</button> </div> <div> <label for="book-2">Aristophanes, Ploutos de god van het geld</label> <button id="boek-2" name="order" value="Aristophanes, Ploutos de god van het geld">Bestel</button> </div> <div> <label for="book-3">Steve Prettyman, Learn PHP 8</label> <button id="prettyman" name="order" value="Steve Prettyman, Learn PHP 8">Bestel</button> </div> <div> <label for="daudet">Alphonse Daudet, Brieven uit mijn molen</label> <button id="daudet" name="order" value="Alphonse Daudet, Brieven uit mijn molen">Bestel</button> </div> </form> <a href="index.php">Terug naar de index pagina</a> </body> </html>
- index.php